package com.qst.dms.net;

import java.net.*;
import java.util.ArrayList;

import com.qst.dms.entity.*;
import com.qst.dms.service.*;

import java.io.*;

/**
 * 从本地数据库中读，换成从远端数据库中读
 * @author lenovo
 */

public class DmsNetServer {
	public DmsNetServer() {
		// 通过使用不同的端口区分接受不同数据：6666端口是日志，6668端口是物流
		// 开启监听6666端口的线程，接受日志数据
		new AcceptLogThread(6666).start();
		// 开启监听6666端口的线程，接受物流数据
		new AcceptTranThread(6668).start();
		System.out.println("网络服务器已开启...");
	}

	// 接收日志数据的线程类
	private class AcceptLogThread extends Thread {
		private ServerSocket serverSocket;
		private Socket socket;
		private LogRecService logRecService;
		private ObjectInputStream ois;

		public AcceptLogThread(int port) {
			logRecService = new LogRecService();
			try {
				serverSocket = new ServerSocket(port);// 通过端口号生成ServerSocket，默认在本机上进行
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		// 将日志数据保存到数据库中
		@Override
		public void run() {
			while (this.isAlive()) {
				try {
					// 接收客户端发过来的套接字
					socket = serverSocket.accept();// 相当于一个server分配一个socket接口
					if (socket != null) {
						ois = new ObjectInputStream(socket.getInputStream());// 通过socket接口，建立一个流
						// 反序列化，得到匹配日志列表
						ArrayList<MatchedLogRec> matchedLogs = (ArrayList<MatchedLogRec>) ois.readObject();
						// 将客户端发送过来的匹配日志信息保存到数据库
						logRecService.saveMatchLogToDB(matchedLogs);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			try {
				ois.close();
				socket.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	// 接收物流数据的线程类
	private class AcceptTranThread extends Thread {
		private ServerSocket serverSocket;
		private Socket socket;
		private TransportService transportService;
		private ObjectInputStream ois;

		public AcceptTranThread(int port) {
			transportService = new TransportService();
			try {
				serverSocket = new ServerSocket(port);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		// 将日志数据保存到数据库中
		@Override
		public void run() {
			while (this.isAlive()) {
				try {
					// 接收客户端发过来的套接字
					socket = serverSocket.accept();
					if (socket != null) {
						ois = new ObjectInputStream(socket.getInputStream());
						// 反序列化，得到匹配物流列表
						ArrayList<MatchedTransport> matchedTransport = (ArrayList<MatchedTransport>) ois.readObject();
						// 将客户端发送过来的匹配日志信息保存到数据库
						transportService.saveMatchTransportToDB(matchedTransport);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			try {
				ois.close();
				socket.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new DmsNetServer();
	}

}
